package br.com.imob.dao;

import br.com.imob.modelo.Estado;

import java.util.HashSet;
import java.util.List;


public class EstadoDao extends GenericDao {

    public EstadoDao() { }

    public Integer adicionarEstado(Estado estado) {
        new PaisDao().adicionarPais(estado.getPais());
        saveOrUpdatePojo(estado);
        return estado.getEstadoId();
    }

    public void removerEstado(Estado estado) {
        removerPojo(estado);
    }

    /* Precisa definir o ID */
    public void atualizarEstado(Estado recupera) {
        saveOrUpdatePojo(recupera);
    }
    /* Precisa definir qual atribuito sera a chave a identificar
     * a tupla a ser alterada */

    /**
	 * Editar um Estado
	 * @param String oldEstado
	 * @param String newEstado
	 */
	public void atualizarEstado(String oldEstado, String newEstado ) {
		if ( ( !"".equals(oldEstado) && oldEstado != null )
			&& ( !"".equals(newEstado) && newEstado != null ) ) 
			atualizarEstado( getEstadoQNamed(oldEstado), new Estado(newEstado) );
	}
    
    
    public void atualizarEstado(Estado recuperar, Estado alterar) {
        recuperar = retriveEstado(recuperar);

        if (alterar.getEstado() != null) recuperar.setEstado(alterar.getEstado());
        
        saveOrUpdatePojo(recuperar);
    }

//	Artificio para Recuperar a Tupla de Estado
    protected Estado retriveEstado(Estado recuperar) {
        if (recuperar.getEstado() != null) {
            return getEstadoQNamed(recuperar.getEstado());
        }
        if (recuperar.getUf() != null) {
            return getEstadoQNamedUf( recuperar.getUf() );
        }
        if (recuperar.getEstadoId() != null) {
            return getEstado(recuperar.getEstadoId());
        }
        return recuperar;
    }

//	Consultas
    public Estado getEstado(Integer key) {
        return getPojoByID(Estado.class, key);
    }

    public Estado getEstadoByQuery(String query, Object... params) {
        return getPojoByQry(query, params);
    }

    public Estado getEstadoQNamed(String fltrEstado) {
        return getPojoByQNamed("Estado.findByEstado", fltrEstado);
    }

    public Estado getEstadoQNamedUf(String fltrUF) {
        return getPojoByQNamed("Estado.findByUf", fltrUF);
    }

    public List<Estado> getEstados() {
        return (List<Estado>) getALL(Estado.class);
    }

    public List<Estado> getEstados(boolean fecharSessao) {
        setSessionClosed( fecharSessao );
        return (List<Estado>) getALL(Estado.class);
    }

    public List<Estado> getEstadosQNamedEstadoPRX(String fltrEstado) {
        return getListByQNamedPRX("Estado.findLikeByEstado", fltrEstado);
    }

    public List<Estado> getEstadosQNamedUFPRX(String fltrUF) {
        return getListByQNamedPRX("Estado.findLikeByUf", fltrUF);
    }

    public List<Estado> getEstadosQNamedAllPRX(String fltrEstado, String fltrUf) {
        List<Estado> itensEstado = getEstadosQNamedEstadoPRX(fltrEstado);
        List<Estado> itensUf = getEstadosQNamedUFPRX(fltrUf);
        HashSet<Estado> itens = new HashSet<Estado>();

        itensEstado.addAll(itensUf);
        itens.addAll(itensEstado);
        itensEstado.clear();
        itensEstado.addAll(itens);
        return itensEstado;
    }

    public List<Estado> getEstadosByQuery(String query, Object... params) {
        return getListByQry(query, params);
    }
}
